package com.z.redis.command.impl;

import com.z.redis.RedisCore;
import com.z.redis.command.Command;
import com.z.redis.command.CommandType;
import com.z.redis.datatype.BytesWrapper;
import com.z.redis.resp.BulkString;
import com.z.redis.resp.Resp;
import com.z.redis.resp.RespArray;
import io.netty.channel.ChannelHandlerContext;

import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Stream;

/**
 * 获取所有键
 */
public class Keys implements Command {
    private String pattern="";
    @Override
    public CommandType type(){
        return CommandType.keys;
    }

    @Override
    public void setContent(Resp[] array){
        //需要转译的字符(    [     {    /    ^    -    $     ¦    }    ]    )    ?    *    +    .
        pattern= "."+((BulkString) array[1]).getContent().toUTF8String();
    }

    /**
     * 从 Redis 中获取所有键。
     * 将这些键转换为 UTF-8 字符串并进行正则匹配。
     * 将符合条件的键封装成 Resp 对象。
     * 将这些 Resp 对象封装成一个 RespArray 并发送出去。
     * @param ctx 通信管道 用于像客户端发送响应
     * @param redisCore 内存数据库 提供API操作键值对
     */
    @Override
    public void handle(ChannelHandlerContext ctx, RedisCore redisCore){
        Set< BytesWrapper> keys = redisCore.keys();
        Resp[] resps = keys.stream().filter(key ->{
            String content = null;
            try {
                content = key.toUTF8String(); // 将二进制转为UTF-8字符串
            }catch (Exception e){
                LOGGER.warn("keys命令模式转换异常");
            }
            return Pattern.matches(pattern,content); // 正则匹配
        }).flatMap(key -> {
            Resp[] info = new Resp[1];
            info[0] = new BulkString(key);
            return Stream.of(info);
        }).toArray(Resp[]::new);
        ctx.writeAndFlush(new RespArray(resps));
    }
}
